package com.zeny.express.framework.shared.encoder;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.zeny.express.framework.shared.domain.Constants;
import com.zeny.express.framework.shared.exception.ApplicationException;

/**
 * MD5 编码
 * 
 * @author zhuwei
 * @date 2013年9月10日 下午12:52:04
 */
public class MD5Encoder {

	/**
	 * 日志
	 */
	protected static final Log LOG = LogFactory.getLog(MD5Encoder.class);

	/**
	 * 线程MD5
	 */
	private static final ThreadLocal<MessageDigest> localMD5Digest = new ThreadLocal<MessageDigest>() {

		@Override
		protected MessageDigest initialValue() {

			try {
				MessageDigest md5 = MessageDigest.getInstance("MD5");

				return md5;
			} catch (NoSuchAlgorithmException e) {
				LOG.error(e.getMessage(), e);
				throw new ApplicationException(ApplicationException.UNKNOWN,
						null);
			}

		}

		@Override
		public MessageDigest get() {
			MessageDigest digest = super.get();
			digest.reset();
			return digest;
		}
	};

	/**
	 * MD5加密
	 * 
	 * @author zhuwei
	 * @date 2013年9月10日 下午12:52:16
	 * @param data
	 * @return
	 */
	public static byte[] encode(byte[] data) {
		MessageDigest md5 = localMD5Digest.get();
		byte[] value = md5.digest(data);

		return value;
	}

	/**
	 * MD5加密，base64编码
	 * 
	 * @author zhuwei
	 * @date 2013年9月10日 下午12:52:25
	 * @param data
	 * @return
	 */
	public static String digest(byte[] data) {

		byte[] value = encode(data);
		String result = new String(Base64.encodeBase64(value),
				Constants.DEFAULT_CHARSET);

		return result;
	}

}
